﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProjetoJornada_DAL;
using MySql.Data.MySqlClient;
using Basicas.Utils;
using Basicas;
using System.Data;

namespace ProjetoJornada_DAL.Repositorio
{
    public class RepCurso
    {
        private DAO dao;

        public RepCurso()
        {
            this.dao = DAO.Instance;
        }

        #region Metodos Carregar
        private Curso CarregarCurso(MySqlDataReader dr)
        {
            Int32 id = dr.GetInt32("Id");
            String nome = dr.GetString("Nome");
            String preReq = dr.GetString("PreRequisitos");
            Int32 cargaHoraria = dr.GetInt32("CargaHoraria");
            String ementa = dr.GetString("Ementa");
            String publico = dr.GetString("PublicoAlvo");
            String descricao = dr.GetString("Descricao");

            return new Curso(id, nome, preReq, cargaHoraria, ementa, publico, descricao);
        }
        private byte[] CarregarLogo(MySqlDataReader dr)
        {
            byte[] logo = dr["Logo"] as byte[];
            return logo;
        } 
        #endregion

        #region Metodos Publicos
        public Int32 InserirCurso(Curso curso)
        {
            string storeProcedure = "sp_Curso_Inserir";

            try
            {
                MySqlParameter[] parametros = new MySqlParameter[8];

                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"nome";
                parametros[0].Value = curso.Nome;
                parametros[0].DbType = DbType.String;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"prerequisitos";
                parametros[1].Value = curso.PreRequisitos;
                parametros[1].DbType = DbType.String;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"cargahoraria";
                parametros[2].Value = curso.CargaHoraria;
                parametros[2].DbType = DbType.Int32;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"ementa";
                parametros[3].Value = curso.Ementa;
                parametros[3].DbType = DbType.String;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"publicoalvo";
                parametros[4].Value = curso.PublicoAlvo;
                parametros[4].DbType = DbType.String;

                parametros[5] = new MySqlParameter();
                parametros[5].ParameterName = @"descricao";
                parametros[5].Value = curso.Descricao;
                parametros[5].DbType = DbType.String;

                parametros[6] = new MySqlParameter();
                parametros[6].ParameterName = @"LogoIn";
                parametros[6].Value = curso.Imagem;
                parametros[6].MySqlDbType = MySqlDbType.Blob;

                parametros[7] = new MySqlParameter();
                parametros[7].ParameterName = @"Result";
                parametros[7].DbType = System.Data.DbType.Int32;
                parametros[7].Direction = ParameterDirection.Output;

                return (int)dao.ExecutaFuncao(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "inserirCurso");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
        }
        public Boolean RemoverCurso(Int32 idCurso)
        {
            Boolean retorno = false;
            MySqlParameter[] paramentros = new MySqlParameter[1];
            String storeProcedure = "sp_Curso_Delete";

            try
            {
                paramentros[0] = new MySqlParameter();
                paramentros[0].ParameterName = @"codigo";
                paramentros[0].DbType = System.Data.DbType.Int32;
                paramentros[0].Value = idCurso;

                retorno = dao.ExecutaSql(paramentros, storeProcedure);

            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "deleteCurso");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return retorno;
        }
        public Boolean EditarCurso(Curso curso)
        {
            String storeProcedure = "sp_Curso_Edit";
            MySqlParameter[] parametros = new MySqlParameter[8];
            Boolean retorno = false;

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"codigo";
                parametros[0].Value = curso.Id;
                parametros[0].DbType = DbType.Int32;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"nomeDigitado";
                parametros[1].Value = curso.Nome;
                parametros[1].DbType = DbType.String;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"preReq";
                parametros[2].Value = curso.PreRequisitos;
                parametros[2].DbType = DbType.String;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"qtdeHoras";
                parametros[3].Value = curso.CargaHoraria;
                parametros[3].DbType = DbType.Int32;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"ementaCurso";
                parametros[4].Value = curso.Ementa;
                parametros[4].DbType = DbType.String;

                parametros[5] = new MySqlParameter();
                parametros[5].ParameterName = @"publico";
                parametros[5].Value = curso.PublicoAlvo;
                parametros[5].DbType = DbType.String;

                parametros[6] = new MySqlParameter();
                parametros[6].ParameterName = @"descricaoCurso";
                parametros[6].Value = curso.Descricao;
                parametros[6].DbType = DbType.String;

                parametros[7] = new MySqlParameter();
                parametros[7].ParameterName = @"logoCurso";
                parametros[7].Value = curso.Imagem;
                parametros[7].MySqlDbType = MySqlDbType.Blob;

                retorno = dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "editarCurso");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return retorno;
        }
        public Boolean EditarSemLogo(Curso curso)
        {
            String storeProcedure = "sp_Curso_Edit_SemLogo";
            MySqlParameter[] parametros = new MySqlParameter[7];
            Boolean retorno = false;

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"codigo";
                parametros[0].Value = curso.Id;
                parametros[0].DbType = DbType.Int32;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"nomeDigitado";
                parametros[1].Value = curso.Nome;
                parametros[1].DbType = DbType.String;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"preReq";
                parametros[2].Value = curso.PreRequisitos;
                parametros[2].DbType = DbType.String;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"qtdeHoras";
                parametros[3].Value = curso.CargaHoraria;
                parametros[3].DbType = DbType.Int32;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"ementaCurso";
                parametros[4].Value = curso.Ementa;
                parametros[4].DbType = DbType.String;

                parametros[5] = new MySqlParameter();
                parametros[5].ParameterName = @"publico";
                parametros[5].Value = curso.PublicoAlvo;
                parametros[5].DbType = DbType.String;

                parametros[6] = new MySqlParameter();
                parametros[6].ParameterName = @"descricaoCurso";
                parametros[6].Value = curso.Descricao;
                parametros[6].DbType = DbType.String;

                retorno = dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "editarCursoSemLogo - Repositorio");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return retorno;
        }
        public Curso ConsultarCursoPorId(Int32 idCurso)
        {
            String storeProcedure = "sp_Curso_Select_Id";
            MySqlParameter[] parametro = new MySqlParameter[1];
            Curso curso = null;
            MySqlDataReader dr = null;

            try
            {
                parametro[0] = new MySqlParameter();
                parametro[0].ParameterName = @"idCurso";
                parametro[0].Value = idCurso;
                parametro[0].DbType = System.Data.DbType.Int32;

                dr = dao.ExecutaLeituraProcedure(parametro, storeProcedure);

                if (dr.Read())
                {
                    curso = this.CarregarCurso(dr);
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarCursoPorIdRepositorio");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return curso;
        }
        public Curso ConsultarCursoPorJornada(Int32 idJornada)
        {
            String storeProcedure = "sp_Curso_Select_Jornada";
            MySqlParameter[] parametro = new MySqlParameter[1];
            Curso curso = null;
            MySqlDataReader dr = null;

            try
            {
                parametro[0] = new MySqlParameter();
                parametro[0].ParameterName = @"idJornadaIn";
                parametro[0].Value = idJornada;
                parametro[0].DbType = System.Data.DbType.Int32;

                dr = dao.ExecutaLeituraProcedure(parametro, storeProcedure);

                if (dr.Read())
                {
                    curso = this.CarregarCurso(dr);
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarCursoPorIdRepositorio");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return curso;
        }
        public List<Curso> ConsultarTodosCursos()
        {
            String storeProcedure = "sp_Curso_Select_All";
            List<Curso> cursos = new List<Curso>();
            MySqlDataReader dr = null;

            try
            {
                dr = dao.ExecutaLeituraProcedure(storeProcedure);

                while (dr.Read())
                {
                    cursos.Add(this.CarregarCurso(dr));
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarTodosCursos");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return cursos;
        }
        public byte[] ConsultarLogo(int idCurso)
        {
            String storeProcedure = "sp_Imagem_Curso_Select";
            MySqlParameter[] parametro = new MySqlParameter[1];
            byte[] retorno = null;
            MySqlDataReader dr = null;

            try
            {
                parametro[0] = new MySqlParameter();
                parametro[0].ParameterName = @"idCursoIn";
                parametro[0].Value = idCurso;
                parametro[0].DbType = System.Data.DbType.Int32;

                dr = dao.ExecutaLeituraProcedure(parametro, storeProcedure);

                if (dr.Read())
                {
                    retorno = this.CarregarLogo(dr);
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarLogoCurso - Repositorio");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return retorno;

        }         
        #endregion
    }
}
